home *** CD-ROM | disk | FTP | other *** search
/ BMUG Revelations / BMUG Revelations.toast / Programming / Programming Languages / Yerk 3.64 / Asm source / ic2 < prev    next >
Text File  |  1986-09-03  |  6KB  |  355 lines

  1. \ IC2 - Build the actual codes and return lengths of the instructions.
  2. \  9/85 RW Split off from instClasses
  3. \  3/06/86  GDC Fixed type 20, MOVEM
  4. \  7/10/86  mrh Fixed type 24, CALL for branches to this type of instruction
  5.  
  6. \ TYPE14 - MOVE instruction
  7. \  the bad one. and I do mean Bad ( Leroy Brown bad )
  8.  
  9. :CLASS type14 <super machInst
  10.  
  11. :M BUILD:       { \ work flag size -- }
  12.     op1 getOp
  13.     op2 getOp
  14.     true -> flag
  15.     mode: op1 sr-type =
  16.     IF
  17.         false -> flag
  18.            sr>-code -> work
  19.            ea: op2 work or w,
  20.     THEN
  21.     mode: op2 sr-type =
  22.     IF
  23.         false -> flag
  24.            >sr-code -> work
  25.            ea: op1 work or w,
  26.     THEN
  27.     mode: op2 ccr-type =
  28.     IF
  29.         false -> flag
  30.             ccr-code -> work
  31.            ea: op1 work or w,
  32.     THEN
  33.     mode: op2 usp-type =
  34.     IF
  35.         false -> flag
  36.            usp-code -> work
  37.            reg: op1 work or w,
  38.     THEN
  39.     mode: op1 usp-type =
  40.     IF
  41.         false -> flag
  42.            usp-code -> work
  43.            reg: op2 work or -> work
  44.            8 ++> work
  45.            work w,
  46.     THEN
  47.     flag
  48.     IF
  49.         opSize
  50.         CASE
  51.             0 OF 1 -> size ENDOF
  52.             1 OF 3 -> size ENDOF
  53.             2 OF 2 -> size ENDOF
  54.         ENDCASE
  55.         get: bytecode -> work
  56.         Size 12 << work or -> work
  57.         reg: op2 9 << work or -> work
  58.         mode: op2 7 min 6 << work or -> work
  59.         ea: op1 work or -> work
  60.         work w,
  61.         op1 compIdxMode
  62.         op2 compIdxMode
  63.     THEN
  64. ;M
  65.  
  66. :M LENGTH:      { \ len -- len }
  67.     op1 getOp
  68.     op1 get: srcMask check
  69.     op2 getOp
  70.     op2 get: dstMask check
  71.     mode: op1 usp-type = mode: op2 1 = not and
  72.     mode: op2 usp-type = mode: op1 1 = not and or
  73.     IF
  74.            208 asmError
  75.     THEN
  76.     1 -> len
  77.     op1 modesize ++> len
  78.     op2 modesize ++> len
  79.     len
  80. ;M
  81.  
  82. ;CLASS
  83.  
  84. \ TYPE15 - MOVEQ. e.g. MOVEQ
  85. :CLASS type15 <super machInst
  86.  
  87. :M BUILD:       { \ work -- }
  88.     op1 getOp
  89.     op2 getOp
  90.     get: bytecode
  91.     value: op1 255 min 0 max or
  92.     reg: op2 9 << or
  93.     w,
  94. ;M
  95.  
  96. :M LENGTH:      ( -- len )
  97.     op1 getOp
  98.     op1 get: srcMask check
  99.     op2 getOp
  100.     op2 get: dstMask check
  101.     1
  102. ;M
  103.  
  104. ;CLASS
  105.  
  106. \ TYPE16 - TRAP, e.g. TRAP #12
  107. :CLASS type16 <super machInst
  108.  
  109. :M BUILD:
  110.     op1 getOp
  111.     get: bytecode
  112.     value: op1 15 min 0 max or
  113.     w,
  114. ;M
  115.  
  116. :M LENGTH:
  117.     op1 getOp
  118.     op1 get: srcMask check
  119.     1
  120. ;M
  121.  
  122. ;CLASS
  123.  
  124. \ TYPE18 - MOVEP
  125. :CLASS type18 <super machInst
  126.  
  127. :M LENGTH:       ( -- len )
  128.     op1 getOp
  129.     op1 get: srcMask check
  130.     op2 getOp
  131.     op2 get: dstMask check
  132.     1
  133.     op1 modesize +
  134.     op2 modesize +
  135. ;M
  136.  
  137. :M BUILD:     { \ work mode dreg areg aOp -- }
  138.     op1 getOp
  139.     op2 getOp
  140.     mode: op1 0=
  141.     IF
  142.         opSize 2 =
  143.         IF
  144.                7 -> mode
  145.         ELSE
  146.                6 -> mode
  147.         THEN
  148.            reg: op1 -> dreg
  149.         reg: op2 -> areg
  150.         op2 -> aOp
  151.     ELSE
  152.         opSize 2 =
  153.         IF
  154.             5 -> mode
  155.         ELSE
  156.             4 -> mode
  157.         THEN
  158.         reg: op2 -> dreg
  159.         reg: op1 -> areg
  160.         op1 -> aOp
  161.     THEN
  162.     get: bytecode -> work
  163.     dreg 9 << work or -> work
  164.     mode 6 << work or -> work
  165.     areg work or -> work
  166.     work w,
  167.     aOp compidxmode
  168. ;M
  169.  
  170. ;CLASS
  171.  
  172. \ TYPE19 - DBCC, etc.
  173. :CLASS type19 <super machInst
  174.  
  175. :M BUILD:
  176.     op1 getOp
  177.     op2 getOp
  178.     get: bytecode
  179.     reg: op1 or
  180.     w,
  181.     op2 compIdxMode
  182. ;M
  183.  
  184. :M LENGTH:
  185.     op1 getOp
  186.     op1 get: srcMask check
  187.     op2 getOp
  188.     op2 get: dstMask check
  189.     2
  190. ;M
  191.  
  192. ;CLASS
  193.  
  194. \ TYPE20 - MOVEM
  195. :CLASS type20 <super machInst
  196.  
  197. :M BUILD:    { \ opDesc regMask drFlag -- }
  198.     msg" build moveMsg"
  199.     op1 getOp
  200.     mode: op1 0= mode: op1 1 = or
  201.     IF                           \ register list in operand 1
  202.         msg" exec IF"
  203.         op1
  204.         mode: op2 4 =
  205.         IF 0 ELSE 1 THEN
  206.         buildRegMask -> regMask  \ make register mask
  207.            op2 getOp
  208.            0 -> drFlag
  209.     ELSE                         \ register list in operand 2
  210.         msg" exec ELSE"
  211.         1 -> drFlag
  212.            nextToken drop
  213.         op2 getOp
  214.         op2 1 buildRegMask -> regMask
  215.     THEN
  216.     get: bytecode
  217.     ea: op1 or
  218.     drFlag 10 << or
  219.     opSize 1 max 1- 6 << or
  220.     w,
  221.     regMask val" regmask is " w,
  222.     op1 compidxmode
  223.     op2 compidxmode
  224. ;M
  225.  
  226. :M LENGTH:   { \ len -- len }
  227.     op1 getop
  228.     op2 getop
  229.     2 -> len
  230.     mode: op1 0= mode: op1 1 = or
  231.     IF
  232.        op2 modesize ++> len
  233.     ELSE
  234.        op1 modesize ++> len
  235.     THEN
  236.     len
  237.     \ Force input of a new line.
  238.     0 -> tiblen 0 -> pos
  239. ;M
  240.  
  241. ;CLASS
  242.  
  243. \ TYPE21 - UNLK
  244. :CLASS type21 <super machInst
  245.  
  246. :M BUILD:
  247.     op1 getOp
  248.     get: bytecode
  249.     reg: op1 or
  250.     w,
  251. ;M
  252.  
  253. :M LENGTH:
  254.     op1 getOp
  255.     op1 get: srcMask check
  256.     1
  257. ;M
  258.  
  259. ;CLASS
  260.  
  261. \ TYPE22 - ADDX, SUBX, CMPM
  262. :CLASS type22 <super machInst
  263.  
  264. :M BUILD:       { \ work -- }
  265.     op1 getOp
  266.     op2 getOp
  267.     get: bytecode -> work
  268.     reg: op1 work or -> work
  269.     opsize 6 << work or -> work
  270.     reg: op2 9 << work or -> work
  271.     mode: op1 4 =
  272.     IF
  273.         8 work or -> work
  274.     THEN
  275.     work w,
  276. ;M
  277.  
  278. :M LENGTH:      { \ len -- len }
  279.     op1 getOp
  280.     op1 get: srcMask check
  281.     op2 getOp
  282.     op2 get: dstMask check
  283.     mode: op1 mode: op2 = not 
  284.     IF
  285.         207 asmError
  286.     THEN
  287.     1 -> len
  288.     op1 modesize ++> len
  289.     op2 modesize ++> len
  290.     len
  291. ;M
  292.  
  293. ;CLASS
  294.  
  295. :CLASS type23 <super machInst
  296.  
  297. :M LENGTH:
  298.     0
  299.     tiblen -> pos
  300. ;M
  301.  
  302. :M BUILD:
  303.     tiblen -> pos
  304. ;M
  305.  
  306. ;CLASS
  307.  
  308. :CLASS type24 <SUPER machInst
  309.  
  310. :M LENGTH:
  311.     1
  312.     tiblen -> pos
  313. ;M
  314.  
  315. :M BUILD:
  316.     nextToken drop 
  317.     get: token AsmCall
  318. ;M
  319.  
  320. ;CLASS
  321.  
  322. \ TYPE26 - Sized instruction with single ea operand, e.g. NOT, CLR, NEG
  323. :CLASS type26 <SUPER machinst
  324.  
  325. :M LENGTH:
  326.     op1 getOp
  327.     op1 get: srcMask check
  328.     1 op1 modesize +
  329. ;M
  330.  
  331. :M BUILD:
  332.     op1 getOp
  333.     get: bytecode ea: op1 or
  334.     opSize 6 << or w,
  335.     op1 compidxmode
  336. ;M
  337.  
  338. ;CLASS
  339.  
  340. :CLASS type27 <SUPER machinst
  341.  
  342. :M LENGTH:
  343.     op1 getOp
  344.     op1 get: srcMask check
  345.     2
  346. ;M
  347.  
  348. :M BUILD:
  349.     op1 getOp
  350.     get: bytecode w,
  351.     value: op1 w,
  352. ;M
  353.  
  354. ;CLASS
  355.